[JAVA 2] Java에서의 변수 선언, 형변환

[JAVA 2] Java에서의 변수 선언, 형변환

Lecture
Language
태그
language
java
public
완성
Y
생성일
Mar 17, 2024 04:30 PM
LectureName
Java

1. 변수란?


“한개의 값을 저장할 수 있는 메모리 공간”을 의미한다. 여러가지 형태로 값을 저장할 수 있으며 저장하기 이전에 자신이 저장할 값의 타입을 선언해야 한다.
  • 좀 더 쉽게 말하면 어떤 것을 저장할 수 있는 공간이다.
  • 대신 형태가 존재하는데, String, int 등 정해진 형태가 있다. 이해하기 쉽게 설명하면 네모 박스에는 네모를 넣어야 하고, 동그라미 박스에는 동그라미를 넣어야 한다.
 
 

1.1 변수의 선언

변수의 선언
int num1 = 0; //해당 형태로도 가능하다. int a = 0, b = 0;
  • int → 자료형 ( 변수가 저장될 타입 )
  • num1 = 변수의 이름
  • 0 = 초기화 된 변수의 값
 
💡
변수를 왜 초기화 해야 할까?
  • 변수를 선언하게 되면 시스템의 메모리 상에 주소 값이 할당되게 된다. 이때 해당 메모리에 어떤 값이 저장되어 있을지 모르기 때문에 초기화 해주어야 한다.
  • 지역 변수의 경우 반드시 초기화를 해주어야 하지만 클래스 타입 변수와 인스턴스 타입 변수는 반드시 초기화를 해줄 필요는 없다.
 
 
변수의 선언 예시
//변수의 선언과 출력을 연습해보자 //class 선언 class v_ex1{ //main 함수 public static void main(String[] args){ //변수의 선언 int year = 0; int age = 14; //변수안에 있는 값을 출력 System.out.println(year); System.out.println(age); //변수 안에 있는 값을 바꾸기 year = age + 2000; age = age + 1; System.out.println(year); System.out.println(age); } }
결과
notion image
 
😇 변수의 이름 규정(java)
  • 대 소문자는 구분된다
  • 예약된 문자열은 사용할 수 없다. (print, class, true.. 등등)
  • 변수의 이름은 숫자로 시작할 수 없다.
  • 특수 문자는 두 개만 허용한다 → _ $
 
🙆🏻 변수의 이름 규정 ( JAVA 개발자들의 암묵적인 약속 )
  • 클래스 이름의 첫 글자는 항상 대문자로 한다 ex) class Hello
  • 여러 단어로 이루어진 이름은 단언의 첫 글자를 대문자로 한다. ex) InstanceOf
  • 상수의 이름은 모두 대문자로 한다. 여러 단어로 이루어진 경우 ‘_’ 로 구별한다
ex) P1, MAX_NUMBER = 30
 
두 변수의 값 비교하기
public class v_change { public static void main(String[] args){ int x = 10, y = 20; //변수의 임시 거처 생성 int tmp = 0; System.out.println("x : " + x + "y : " + y); //x의 값을 임의의 변수인 tmp에 넣고 x에 y값을 대입, tmp의 값을 y에 대입함 tmp = x; x = y; y = tmp; System.out.println("x : " + x + "y : " + y); } }
결과
notion image
 
 

1.2 변수의 타입

기본형
  • 논리형(boolean)
  • 문자형(char)
  • 정수형(byte, short, int, long)
  • 실수형(float, double)
💡
실수형의 정밀도 float는 큰 값을 저장할 수 있지만 float의 정밀도는 7자리 이고, double은 15자리이다. 따라서 정확한 값을 저장하고 싶다면 double을 사용하는 것이 좋다.
 
참조형
  • 객체의 주소(4byte)를 저장한다. 8개의 기본형을 제외한 나머지 타입이다.
 
 

1.3 상수와 리터럴

상수?
  • 변수와 같지만, 변수와 달리 한번 값을 저장하면 다른 값으로 변경할 수 없다.
  • 변수를 선언하는 법과 같지만 변수의 타입 앞에 final을 붙여주기만 하면 된다.
 
리터럴
→ 헷갈리는 사람이 있을 것 이다. 기존에 자신이 알고 있는 상수는 1,3,4와 같은 ‘수’ 인데 JAVA에서는 상수를 다르게 정의했기 때문이다. 따라서 int a = 30; 이라는 구문에서 30은 상수가 아닌 리터럴 이라고 표기하도록 약속하였다.
final int COUNT = 100; //상수 //리터럴
💡
상수가 필요한 이유?
  • 상수를 사용하게 되면 계산식과 같은 코드에서 수식이 명확해진다(10*20 → width*height)
  • 코드의 수정이 용이하다.
 
 
리터럴의 타입 (정수형)
int a = 0x1 // 16진수 int a = 0; //10진수 int a = 01; // 8진수 int a = 0b1; // 2진수 long a = 1L; //접미사 l float b = 1.0f // 접미사 f double b = 1.0 // 접미사를 안붙여도 됨, 실수형의 기본 자료형은 dobule double b = 1.0d // 붙여도 됨.
 
자료형과 다른 형태의 리터럴을 넣으면 어떻게 될까?
  • 리터럴의 타입은 저장된 변수의 타입과 일치하는 것이 보통이지만 범위가 넓은 타입에 좁은 타입의 값을 저장하는 것은 허용된다. (int < long)
int a = 'A' //가능, A의 유니코드인 65가 저장됨 long num = 10 //가능 double d = 1.1f //가능 int a = 0x999999999 //에러, int 타입(2^7-1)의 범위를 벗어남 float f = 3.14 //에러, double타입의 범위가 더 넓음
 
 
문자열 리터럴
  • 작은 따옴표( ‘ ) 로 감싼 문자를 ‘문자 리터럴’ 이라고 한다. 만약 문장을 출력하고 싶다면 큰 따옴표( ” )로 묶어 표현한다.
//문자열을 표기하는 법 //정석 String name = new String("hello world!"); //허용 String name = "Hello world!" //문자 리터럴과의 차이 //char은 빈 문자로 초기화 가 String name = "" //허용 char name = '' //에러
문자열은 변수 선언 시 빈 문자열로 초기화가 가능하지만 문자는 불가능하다.
 
문자열의 덧셈 규칙
  • 문자열은 기본적으로 + 연산을 통해 더할 수 있으며 다른 자료형과 + 연산을 한다면 다른 자료형도 문자열 형태로 형 변환 된다.
String name = "kim" + "jae" //kimjae String name2 = "kim" + 8 //kim8 //빈 문자열과 숫자를 더해도 문자열로 출력된다 System.out.println(""+7) //"7"
 
 
 

1.4 지시자와 Printf() 함수

지시자
  1. 지시자?
  • 일반적으로 사용자로부터 입력을 받아들이거나 결과를 출력하기 위하여 사용하는 형식.
지시자
설명
%b
boolean 형식으로 출력
%d
10진수 (int) 형식으로 출력
%o
8진수 형식으로 출력
%x
16진수 형식으로 출력
%f
부동 소수점(float) 형식으로 출력
%e
지수 형식으로 출력
%c
문자로 출력
%s
문자열 형태로 출력
%n
줄 바꿈(enter)
 
 
Printf() 함수
  • Println() 함수와 유사해 보이지만 그냥 변수를 출력 하는게 아닌 형식을 지정하여 출력하고자 할 때 사용하는 함수이다.
//지시자와 printf //형식 지정 System.out.printf("number = %d", num1); //int num1 = 14; System.out.printf("number2 = %f", num2); //float num2 = 3.14; //출력 형식 지정 //공백 포함 출력 System.out.printf("%5d", num1) //출력결과 : " 14" System.out.printf("%-5d", num1) //출력결과 : "14 " //16진수 출력 시 앞에 0x를 붙여줌 System.out.printf("%#x", num3) //출력결과 : "0x101" //몇번째 숫자까지 출력 System.out.printf(".1f", num2) //출력 결과 3, 왼쪽에서 첫번째 소숫점 자리수 까지 출력 System.out.printf(".6s", s1) //출력 결과 "hello ", 왼쪽에서 6번째 문자까지 출
💡
printf() 함수의 경우 지시자 지정을 해줄 때 해당 지시자와 리터럴의 타입이 맞지 않으면 에러가 발생한다.
 

1.5 입력(Scanner)

Scanner
스캐너 클래스를 사용하여 화면에서 값을 입력 받아 보자
//자바 유틸 라이브러리 import import java.util.*; Scanner scanner = new Scanner(System.in); //Scanner클래스의 객체를 생성 String input = scanner.nextLine(); //입력을 마치고 엔터를 칠때까지 입력대기 //tip 문자열 -> 정수 형변환 num = Integer.parseInt(string) //입력받은 문자열을 정수형태로 바꾸기 num = scanner.nextInt() //바로 정수 입력받기
 
 
 
 

2. 형변환(캐스팅)


2.1 형변환?

형 변환이란 변수의 데이터 타입을 다른 데이터 타입으로 변환하는 것을 의미합니다. 이는 데이터 타입에 대한 이해와 관련이 있으며, 변수의 값이나 정확도를 유지하거나 변경할 수 있습니다. 자바에서는 명시적 형 변환과 암시적 형 변환(자동 형변환)이 있으며, 명시적 형 변환은 큰 데이터 타입으로의 변환일 때 사용됩니다
 
형변환 예시
  • (자료형)피연산자 형태로 작성해주면 된다
//형 변환 예 float f = 3.14f; int a = int(f); //a = 3
 
 

2.2 Java 변수 형 변환

형 변환 방법
double score = 11.1; score = (int)score; //11.0 //리터럴 형변환 int score2 = (int)11.1; //11
 
자료형 간 형 변환

자료형 간 형 변환

자바에서는 크기가 작은 자료형에서 큰 자료형으로 형 변환하는 것이 자동으로 이루어집니다. 예를 들어, byte에서 int로의 형 변환은 자동으로 이루어집니다. 그러나 큰 자료형에서 작은 자료형으로 형 변환하려면 명시적으로 형 변환을 해야 합니다. 이때 데이터의 손실이 발생할 수 있으므로 주의해야 합니다.
예를 들어, int 타입의 변수 numbyte 타입으로 형 변환하면 다음과 같이 할 수 있습니다.
int num = 300; byte b = (byte) num; System.out.println(b);
위 코드에서 num 변수에는 300이 할당되어 있습니다. 이를 byte 타입으로 형 변환하면 데이터의 손실이 발생합니다. byte 타입은 -128부터 127까지의 값을 표현할 수 있기 때문입니다. 따라서 위 코드에서 출력되는 값은 44가 됩니다.
44
이처럼 자료형 간의 형 변환은 데이터의 손실이 발생할 수 있으므로, 주의해서 사용해야 합니다.
  • 작은 자료형에서 큰 자료형으로 형 변환은 문제가 되지 않습니다.
  • 큰 자료형에서 작은 자료형으로 변환 하는 건 프로그래머가 의도한 동작임을 명시해야 합니다.
 
자동 형변환 가능 도식화
byte(1byte)
short(2byte)
int(4byte) char(4byte)
long(8byte)
float(4byte)
double(8byte)